package org.jsola.hr.service;

import com.alipay.api.CertAlipayRequest;
import org.jsola.approval.vo.UserApproVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ITransferAccountsBatchDAO;
import org.jsola.hr.dto.TransferAccountsBatchAddDTO;
import org.jsola.hr.dto.TransferAccountsBatchAgainAddDTO;
import org.jsola.hr.dto.TransferAccountsBatchUpdateDTO;
import org.jsola.hr.entity.TransferAccountsBatchDO;
import org.jsola.hr.query.*;
import org.jsola.hr.vo.*;
import org.jsola.hr.vo.payAli.AliPayUrlVO;
import org.jsola.hr.vo.payWx.VxConfigVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.List;


/**
 * 转账批次
 *
 * @author zhr
 */
public interface ITransferAccountsBatchService extends IService<ITransferAccountsBatchDAO, TransferAccountsBatchDO> {

    /**
     * 新增转账批次
     * @param transferAccountsBatchAddDTO 新增转账批次DTO
     * @param tokenUser 当前用户
     * @return 转账批次详情信息
     */
    TransferAccountsBatchVO save(TransferAccountsBatchAddDTO transferAccountsBatchAddDTO, TokenUser tokenUser);

    /**
     * 新增转账批次(业务逻辑的新增方法)
     * @param transferAccountsBatchAddDTO 新增转账批次DTO
     * @param tokenUser 当前用户
     * @return 转账批次详情信息
     */
    TransferAccountsBatchVO saveLogic(TransferAccountsBatchAddDTO transferAccountsBatchAddDTO, TokenUser tokenUser);

    /**
     * 驳回批次重新发起
     * @param transferAccountsBatchAgainAddDTO 重新发起【转账批次】的DTO
     * @param tokenUser 当前用户
     * @return 转账批次详情信息
     */
    TransferAccountsBatchVO saveAgainByBatchId(TransferAccountsBatchAgainAddDTO transferAccountsBatchAgainAddDTO, TokenUser tokenUser);

    /**
     * 根据参数直接创建批次
     * @param transferBuildDetailQuery 参数信息
     * @param tokenUser 当前用户
     * @return 成功和失败的明细列表
     */
    TransferAccountsDetailImportAllVO saveBatchAndDetail(TransferBuildDetailQuery transferBuildDetailQuery, TokenUser tokenUser);

    /**
     * 修改转账批次
     * @param transferAccountsBatchUpdateDTO 修改转账批次DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(TransferAccountsBatchUpdateDTO transferAccountsBatchUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除转账批次，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param transferAccountsBatchIds 转账批次id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...transferAccountsBatchIds);

    /**
     * 根据转账批次id查找
     * @param transferAccountsBatchId 转账批次id
     * @param siteId 所属站点id
     * @return 转账批次详情信息
     */
    TransferAccountsBatchVO selectById(String transferAccountsBatchId, String siteId);

    /**
     * 查询转账批次
     * @param transferAccountsBatchQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账批次列表信息
     */
    List<TransferAccountsBatchListVO> select(TransferAccountsBatchQuery transferAccountsBatchQuery, String siteId);

    /**
    * 查询转账批次记录数
    * @param transferAccountsBatchQuery 查询条件
    * @param siteId 所属站点id
    * @return 转账批次记录数
    */
    int selectCount(TransferAccountsBatchQuery transferAccountsBatchQuery, String siteId);

    /**
     * 分页查询转账批次
     * @param transferAccountsBatchQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账批次列表信息
     */
    Page<TransferAccountsBatchListVO> selectPage(TransferAccountsBatchQuery transferAccountsBatchQuery, String siteId);


    /**
     * 根据转账批次id查找
     * @param transferAccountsBatchId 转账批次id
     * @param siteId 所属站点id
     * @return 转账批次
     */
    TransferAccountsBatchDO selectDOById(String transferAccountsBatchId, String siteId);

    /**
     * 查询转账批次
     * @param transferAccountsBatchQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账批次列表
     */
    List<TransferAccountsBatchDO> selectDO(TransferAccountsBatchQuery transferAccountsBatchQuery, String siteId);

    /**
     * 根据批次id 修改批次明细里面的业务状态 (会校验明细信息)
     * @param transferAccountsBatchId 转账批次id
     * @param subjectStatus 业务状态
     * @param siteId 所属站点id
     * @return 修改个数
     */
    int updateDetailSubjectStatusByBatchId(String transferAccountsBatchId, Integer subjectStatus, String siteId);

    /**
     * 发起审批
     *
     * @param transferAccountsBatchId 转账批次id
     * @param flowId                  审批id
     * @param tokenUser               当前用户
     * @return 审批详情
     */
    UserApproVO launchApproveByCompanyId(String transferAccountsBatchId, String flowId, TokenUser tokenUser);

    /**
     * 发起审批
     *
     * @param transferAccountsBatchId 转账批次id
     * @param flowId                  审批id
     * @param tokenUser               当前用户
     * @return 审批详情
     */
    UserApproVO startApprover(String transferAccountsBatchId, String flowId, TokenUser tokenUser);

    /**
     * 分页查询转账批次-审批中
     *
     * @param transferAccountsBatchQuery 转账批次查询参数
     * @param tokenUser                  当前用户
     * @return page
     */
    Page<TransferAccountsBatchListVO> pageApproving(TransferAccountsBatchQuery transferAccountsBatchQuery,
                                                    TokenUser tokenUser);

    /**
     * 分页查询转账批次-审批通过
     *
     * @param transferAccountsBatchQuery 转账批次查询参数
     * @param tokenUser                  当前用户
     * @return page
     */
    Page<TransferAccountsBatchListVO> pageApprovedPass(TransferAccountsBatchQuery transferAccountsBatchQuery,
                                                       TokenUser tokenUser);

    /**
     * 分页查询转账批次-审批驳回
     *
     * @param transferAccountsBatchQuery 转账批次查询参数
     * @param tokenUser                  当前用户
     * @return page
     */
    Page<TransferAccountsBatchListVO> pageApprovedReject(TransferAccountsBatchQuery transferAccountsBatchQuery,
                                                         TokenUser tokenUser);

    /**
     * 分页查询转账批次-抄送我
     *
     * @param transferAccountsBatchQuery 转账批次查询参数
     * @param tokenUser                  当前用户
     * @return page
     */
    Page<TransferAccountsBatchListVO> pageApproveNotifierMe(TransferAccountsBatchQuery transferAccountsBatchQuery,
                                                            TokenUser tokenUser);

    /**
     * 导入的方式创建批次
     * @param file 待识别的文件
     * @param companyId 公司id
     * @param companyName 公司名称
     * @param type 到账方式
     * @param orderTitle 批次名称
     * @param remark 备注
     * @param tokenUser 当前用户
     * @return 批次明细Lst
     */
    TransferAccountsDetailImportAllVO saveBatchAndDetailByFile(File file, String companyId,
                                                               String companyName, Integer type, String orderTitle,
                                                               String remark, TokenUser tokenUser);

    /**
     * 根据支付宝发起批次的参数 发起支付宝批次转账到户
     * @param transferStartZfbBatchQuery 发起支付宝批次订单参数
     * @param tokenUser 当前用户
     * @return 支付URL
     */
    AliPayUrlVO zfbStartTransferAccounts(TransferStartZfbBatchQuery transferStartZfbBatchQuery, TokenUser tokenUser);

    /**
     * 支付宝安全发  发送验证码
     * @param phone 手机号
     * @param tokenUser 当前用户
     * @return 是否发送成功
     */
    boolean sendSafetyPayPhoneMessage(String phone, TokenUser tokenUser);

    /**
     * 根据支付宝发起批次的参数 发起支付宝批次转账到户
     * 安全发无密: 调用的是单笔转账到户，该方法支付宝同步返回结果，hr异步修改批次状态
     * @param transferStartZfbSafetyBatchQuery 发起支付宝批次订单参数
     * @param tokenUser 当前用户
     * @return success
     */
    String zfbSafetyStartTransferAccounts(TransferStartZfbSafetyBatchQuery transferStartZfbSafetyBatchQuery, TokenUser tokenUser);

    /**
     * 根据支付宝发起批次的参数 发起支付宝批次转账到卡
     * 安全发无密: 调用的是单笔转账到卡，该方法支付宝异步返回结果，hr修改批次状态
     * @param transferStartZfbSafetyBatchQuery 发起支付宝批次订单参数
     * @param tokenUser 当前用户
     * @return success
     */
    String zfbSafetyStartTransferAccountsToBankCard(TransferStartZfbSafetyBatchQuery transferStartZfbSafetyBatchQuery, TokenUser tokenUser);

    /**
     * 根据支付宝发起批次的参数 发起支付宝批次转账到户
     * 安全发无密: 调用的是批量转账到户，该方法需要提供支付宝异步通知的接口
     * @param transferStartZfbSafetyBatchQuery 发起支付宝批次订单参数
     * @param tokenUser 当前用户
     * @return success
     */
    String zfbSafetyBatchStartTransferAccounts(TransferStartZfbSafetyBatchQuery transferStartZfbSafetyBatchQuery, TokenUser tokenUser);


    /**
     * 根据微信发起批次的参数 发起微信批次转账到户
     * @param transferStartVxBatchQuery 发起微信批次订单参数
     * @param tokenUser 当前用户
     */
    void vxStartTransferAccounts(TransferStartVxBatchQuery transferStartVxBatchQuery, TokenUser tokenUser);

    /**
     * 根据平安银行发起批次的参数 发起平安银行批次转账到卡
     * @param transferStartPingAnBankBatchQuery 发起平安银行批次订单参数
     * @param tokenUser 当前用户
     */
    void pingAnStartTransferAccounts(TransferStartPingAnBankBatchQuery transferStartPingAnBankBatchQuery, TokenUser tokenUser);

    /**
     * 获取支付宝批量到户有密 相关的配置参数
     * @return 支付宝批量到户有密相关的配置参数
     */
    CertAlipayRequest buildCertAlipayRequest();

    /**
     * 获取支付宝安全发无密 相关的配置参数
     * @return 支付宝安全发无密相关的配置参数
     */
    CertAlipayRequest buildCertAlipaySafetyRequest();

    /**
     * 获取微信转账相关的配置参数
     * @param siteId 租户id
     * @return 微信转账相关的配置参数
     */
    VxConfigVO selectVxConfigVO(String siteId);

    /**
     * 支付宝调用 修改批次状态
     * @param requestBodyStr requestBody字符串
     * @return success or fail
     */
    String offerAliPay(String requestBodyStr);

    /**
     * 支付宝安全发调用 修改批次明细状态
     * @param requestBodyStr requestBody字符串
     * @return success or fail
     */
    String offerAliSafetyPay(String requestBodyStr);

    /**
     * 查询批次支付状态
     * @param transferAccountsBatchId 批次id
     * @param tokenUser 当前用户
     * @return 1
     */
    int selectTransferAccountsBatch(String transferAccountsBatchId, TokenUser tokenUser);

    /**
     * 缓存商户token
     * @param appAuthCode code
     * @return 商户token
     */
    String setAppAuthTokenToRedis(String appAuthCode);

    /**
     * 统计各个状态的批次数量(根据公司List)
     * @param companyIds 公司ids
     * @param tokenUser 当前用户
     * @return 统计信息
     */
    TransferAccountsBatchStatisticsVO statisticsBatchStatusByCompanyIds(List<String> companyIds, TokenUser tokenUser);

    /**
     * 分页查询包含审批状态的转账批次(审批中+已通过+已驳回+抄送我)
     *
     * @param batchQuery 查询对象
     * @param tokenUser  当前用户
     * @return page
     */
    Page<TransferAccountsBatchListVO> pageApprove(TransferAccountsBatchQuery batchQuery, TokenUser tokenUser);

    /**
     * 分页查询全部审批状态的转账批次(审批中+已通过+已驳回+抄送我)
     *
     * @param batchQuery 查询对象
     * @param tokenUser  当前用户
     * @return page
     */
    Page<TransferAccountsBatchListVO> pageAllApprove(TransferAccountsBatchQuery batchQuery, TokenUser tokenUser);

    /**
     * 查询全部审批状态的转账批次(审批中+已通过+已驳回+抄送我)
     *
     * @param batchQuery 查询对象
     * @param tokenUser  当前用户
     * @return page
     */
    List<TransferAccountsBatchListVO> listAllApprove(TransferAccountsBatchQuery batchQuery, TokenUser tokenUser);

    /**
     * 根据参数全选发薪人员
     * @param type 类型： 1：人员库，2：花名册
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 批次转账人员信息
     */
    List<TransferBuildDetailAddVO> buildAllInfo(Integer type, String companyId, TokenUser tokenUser);

    /**
     * 根据批次名称（转账标题）查询转账批次
     * @param orderTitle 批次名称
     * @param siteId 所属站点id
     * @return 转账批次列表
     */
    List<TransferAccountsBatchDO> selectByOrderTitle(String orderTitle, String siteId);

    /**
     * 根据支付宝授权code 修改账号里面的token信息
     * @param code 授权code
     * @param pid 支付宝pid
     * @param tokenUser 当前用户
     * @return 1
     */
    int updateZfbAppAuthToken(String code, String pid, TokenUser tokenUser);


}


